/*
 * Copyright (C) 2024-2025 Carl Seifert
 * Copyright (C) 2024-2025 TU Dresden
 *
 * This file is subject to the terms and conditions of the GNU Lesser General
 * Public License v2.1. See the file LICENSE in the top level directory for
 * more details.
 */

#pragma once

#include <assert.h>

#include "modules.h"

/**
 * @defgroup net_unicoap_config unicoap Compile-Time Configuration
 * @ingroup  net_unicoap
 * @ingroup  config
 * @brief    Customize limits and capabilities of unicoap
 * @{
 */

/**
 * @file
 * @brief  Compile-time configuration parameters
 * @author Carl Seifert <carl.seifert1@mailbox.tu-dresden.de>
 */

/* MARK: - Essentials */
/**
 * @name Essentials
 * @{
 */
/**
 * @brief Enables debug logging in all `unicoap` source files, except where locally overwritten
 *
 * **Default**: enabled
 */
#if !defined(CONFIG_UNICOAP_DEBUG_LOGGING) || defined(DOXYGEN)
#  define CONFIG_UNICOAP_DEBUG_LOGGING 0
#endif
/** @} */

/* MARK: - Limits */
/**
 * @name Limits
 * @{
 */
/**
 * @brief Maximum number of options that can be present in a request or response
 *
 * **Default**: 16 options
 */
#if !defined(CONFIG_UNICOAP_OPTIONS_MAX) || defined(DOXYGEN)
#  define CONFIG_UNICOAP_OPTIONS_MAX (16)
#endif

/**
 * @brief Default buffer capacity unicoap chooses when you invoke @ref UNICOAP_OPTIONS_ALLOC_DEFAULT
 *
 * Options are stored in a contiguous memory region according to the format specified in
 * [RFC 7252, Section 3.1](https://datatracker.ietf.org/doc/html/rfc7252#section-3.1).
 * This parameter does not affect @ref UNICOAP_OPTIONS_ALLOC.
 *
 * **Default**: 32 bytes
 */
#if !defined(CONFIG_UNICOAP_OPTIONS_BUFFER_DEFAULT_CAPACITY) || defined(DOXYGEN)
#  define CONFIG_UNICOAP_OPTIONS_BUFFER_DEFAULT_CAPACITY (32)
#endif

/**
 * @brief Size of buffer unicoap allocates for a CoAP message header,
 * including token length.
 */
#define UNICOAP_HEADER_SIZE_MAX (15)
/* MARK: unicoap_driver_extension_point */
/* Developer note: If you are adding another CoAP driver, you may need to increase this value. */

/**
 * @brief Maximum length of a token received from a client
 *
 * **Default**: 8 bytes
 */
#if !defined(CONFIG_UNICOAP_EXTERNAL_TOKEN_LENGTH_MAX) || defined(DOXYGEN)
#  define CONFIG_UNICOAP_EXTERNAL_TOKEN_LENGTH_MAX (8)
#endif

static_assert(CONFIG_UNICOAP_EXTERNAL_TOKEN_LENGTH_MAX > 0,
              "CONFIG_UNICOAP_EXTERNAL_TOKEN_LENGTH_MAX must not be zero");

/**
 * @brief Length of tokens generated by the unicoap client API
 *
 * **Default**: 2 bytes
 */
#if !defined(CONFIG_UNICOAP_GENERATED_TOKEN_LENGTH) || defined(DOXYGEN)
#  define CONFIG_UNICOAP_GENERATED_TOKEN_LENGTH (2)
#endif

static_assert(CONFIG_UNICOAP_GENERATED_TOKEN_LENGTH > 0,
              "CONFIG_UNICOAP_GENERATED_TOKEN_LENGTH must not be zero");

/**
 * @brief Numbers of bits needed to represent a given ETag's length
 */
#define UNICOAP_ETAG_LENGTH_FIXED_WIDTH 4
/** @} */

/* MARK: - Timing */
/**
 * @name Timing
 *
 * These parameters are defined as being configurable in [RFC 7252, section 4.8.1]
 * (https://tools.ietf.org/html/rfc7252#section-4.8.1).
 * @{
 */

/**
 * @brief `NSTART` constant for multicast delay calculation
 */
#define UNICOAP_NSTART          (1)

/**
 * @brief `DEFAULT_LEISURE` constant for multicast delay calculation
 */
#define UNICOAP_DEFAULT_LEISURE (5)
/** @} */

/* MARK: - Resource observation */
/**
 * @name Resource observation
 * @{
 */
/**
 * @brief Width in bytes of the Observe option value for a notification
 *
 * **Maximum allowed value**: 3 bytes
 */
#if !defined(CONFIG_UNICOAP_OBSERVE_VALUE_WIDTH) || defined(DOXYGEN)
#  define CONFIG_UNICOAP_OBSERVE_VALUE_WIDTH (3)
#endif

/**
 * @brief See @ref  CONFIG_UNICOAP_OBSERVE_VALUE_WIDTH
 */
#if (CONFIG_UNICOAP_OBSERVE_VALUE_WIDTH == 3)
#  define UNICOAP_OBS_TICK_EXPONENT (0)
#elif (CONFIG_UNICOAP_OBSERVE_VALUE_WIDTH == 2)
#  define UNICOAP_OBS_TICK_EXPONENT (6)
#elif (CONFIG_UNICOAP_OBSERVE_VALUE_WIDTH == 1)
#  define UNICOAP_OBS_TICK_EXPONENT (14)
#else
#  error CONFIG_UNICOAP_OBSERVE_VALUE_WIDTH must not exceed 3
#endif
/** @} */

#ifdef __cplusplus
extern "C" {
}
#endif

/** @} */
